<?php

namespace app\api\service\shop;

use app\admin\model\template\Order;
use app\admin\model\template\Template;
use think\Db;
use think\Exception;
use think\exception\PDOException;

/**
 * 核算模板服务类
 */
class AccountTemplateService
{

    /**
     * 获取模板列表
     * @param int $page 页码
     * @param int $limit 每页展示条数
     * @param string|null $content 搜索内容
     * @return array|null 返回查询的数据或null
     */
    public function getTemplateList(int $page, int $limit, string $content = null): ?array
    {
        $data = Template::where('status', 1)
            ->where(function ($query) use ($content) {
                if ($content) {
                    $query->where('product_name', 'like', '%' . $content . '%')
                        ->whereOr('sn', $content);
                }
            })
            ->field(['id', 'thumbnail','user_id', 'product_name', 'price', 'product_id', 'sales'])
            ->order('sales', 'desc')
            ->order('id','desc')
            ->paginate($limit)
            ->each(function ($item) {
                $item->append(['product_sn','company_name']);
            });
        return ['total' => $data->total(), 'row' => $data->items()];
    }

    /**
     * 获取模板详情
     * @param int $id 模板ID
     * @param int $userId 用户ID
     */
    public function getTemplateInfo(int $id)
    {
        $data = Template::where(['id' => $id])
            ->field(['id', 'product_id', 'product_name','images','category_id','group_id', 'user_id', 'status', 'name', 'check_status', 'sales', 'price', 'sn', 'description', 'thumbnail', 'snapshot', 'node', 'data', 'quote', 'reason', 'checktime', 'updatetime'])
            ->find();
        if ($data) {
            $data->append(['product_sn','company_name','category_name','group_name']);
        }
        return $data;
    }

    /**
     * 个人用户购买模板
     * @param int $id 模板ID
     * @param int|null $userId 用户ID
     * @param string $orderId 订单编号
     */
    public function buyTemplate(int $id, int $userId, string $orderId): ?string
    {
        $template = Template::where(['id' => $id])->find();
        if (is_null($template)) return '当前模板不存在, 请选择其他模板进行购买';
        if ($template->status == 0) return '当前模板未上架, 请选择其他模板进行购买';
        if (is_null($template->product)) return '当前产品不存在, 请选择其他产品进行购买';
        if ($template->product->user_id == $userId) return '当前正在购买自己创建的模板, 请勿购买自己的模板';
        $qd = Db::connect(config('database.qd'));
        $price = $template->price;
        $score = $qd->table('fa_user')->where('id', $userId)->value('score');
        if (is_null($score)) return '当前用户不存在';
        $order = new Order();
        $order->order_sn = $orderId;
        $order->template_id = $id;
        $order->user_id = $userId;
        $order->price = $price;
        $order->pay_state = 0;
        $order->type = 1;
        $order->save();
        if ($score < $price) return '当前用户能量不足, 请获取能量';
        // 开启事务
        $qd->startTrans();
        Db::startTrans();
        try {
            // 扣费
            $data = $qd->table('fa_user')
                ->where('id', $userId)
                ->setDec('score', $price);
            if (!$data || is_string($data)) throw new Exception('当前扣费失败, 请重新支付');
            // 检查余额是否为负
            $money = $qd->table('fa_user')
                ->where('id', $userId)
                ->value('score');
            if (is_null($money) || $money < 0 || is_string($money)) throw new Exception('当前扣费失败, 请检查能量余额');
            // 扣费记录
            $num = $qd->table('fa_user_score_log')
                ->insert(['user_id' => $userId, 'score' => $price, 'before' => $score, 'after' => $money, 'memo' => '购买模板, 订单号' . $order, 'createtime' => time()]);
            if (!$num || is_string($num)) throw new Exception('当前扣费失败, 请重新支付');
            // 修改支付状态
            $result = Db::name('order')
                ->where('order_sn', $orderId)
                ->update(['pay_state' => 1, 'paytime' => time()]);
            if (!$result || is_string($result)) throw new Exception('当前扣费失败, 请重新支付');
            $qd->commit();
            Db::commit();
        } catch (Exception|PDOException $e) {
            $qd->rollback();
            Db::rollback();
            return $e->getMessage();
        }
        return null;
    }

}